﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MedicalManagementSystem.Utils;

namespace MedicalManagementSystem.Models
{
    public partial class Diagnos : IValidatable
    {
        public static Diagnos GetByPK(int id)
        {
            return DbContext.Instance.Diagnos.Where(diagnos => diagnos.id == id).FirstOrDefault();
        }

        public void Load()
        {
            if (EntityState != System.Data.EntityState.Added && EntityState != System.Data.EntityState.Detached)
            {
                if (!this.DiagnosBlocReference.IsLoaded)
                {
                    this.DiagnosBlocReference.Load();
                }
            }
        }

        public static IDictionary<int, string> GetDiagnosDictionary(int blockId)
        {
            return DbContext.Instance.Diagnos.Where(d=>d.DiagnosBloc.id==blockId).OrderBy(d=>d.Name)
                .Each(d => d.Load()).ToDictionary(d => d.id, d => d.Name); 
        }

        #region Validation
        public bool IsUniqueName()         
        {
            return !DbContext.Instance.Diagnos.Any(diagnos => diagnos.Name == Name && diagnos.id != id);
        }       

        public bool CheckBeforeSave()
        {
            return GetRuleViolations().Count() == 0;
        }

        public IEnumerable<IRuleViolation> GetRuleViolations()
        {
            if (string.IsNullOrEmpty(MKB))
            {
                yield return new RuleViolation("Шифр по МКБ-10 не может быть пустым", this, "MKB", MKB);
            }
            else
            {
                if (MKB != MKB.Trim())
                    yield return new RuleViolation("Шифр по МКБ-10 не может начинаться/заканчиваться пробельными символами", this, "MKB", MKB);                
            }

            if (string.IsNullOrEmpty(Name))
            {
                yield return new RuleViolation("Название диагноза не может быть пустым", this, "Name", Name);
                
            }
            else
            {
                if (Name != Name.Trim())
                {
                    yield return new RuleViolation("Название диагноза не может начинаться/заканчиваться пробельными символами",
                        this, "Name", Name);
                    yield break;
                }                

                if (!IsUniqueName())
                {
                    yield return new RuleViolation("Диагноз с таким названием уже существует", this, "Name", Name);
                }
            }
            
            yield break;
        }
        #endregion
    }
}
